
#include "SQLCharExpr.h"

#include "../../visitor/SQLASTVisitor.h"
#include "../../../utils/StringUtils.h"
#include "../statement/SQLCharacterDataType.h"

string_ptr SQLCharExpr::class_ = make_string_ptr("SQLCharExpr");
SQLDataType_ptr SQLCharExpr::DATA_TYPE = SQLCharacterDataType_ptr(new SQLCharacterDataType(make_string_ptr("char")));

SQLCharExpr::SQLCharExpr()
{
}

SQLCharExpr::~SQLCharExpr()
{
}

SQLCharExpr::SQLCharExpr(string_ptr thetext)
 : super(thetext)
{
  // super(thetext);
}

SQLCharExpr::SQLCharExpr(string_ptr text, SQLObject_ptr parent)
{
  this->text = text;
  this->parent = parent;
}

void SQLCharExpr::output(std::stringstream * buf)
{
  if ((*text == "") || (text->length() == 0))
  {
    // buf.append("NULL");
    (*buf)<<"NULL";
  }
  else
  {
    // buf.append("'");
    // buf.append(this.text.replaceAll("'", "''"));
    // buf.append("'");

    (*buf)<<"'";
    text = StringUtils::replaceAll(text, make_string_ptr("'"), make_string_ptr("''"));
    (*buf)<<*text;
    (*buf)<<"'";
  }
}

void SQLCharExpr::accept0(SQLASTVisitor_ptr visitor)
{
  visitor->visit(SharedObject(SQLCharExpr));
  visitor->endVisit(SharedObject(SQLCharExpr));
}

// SQLCharExpr *SQLCharExpr::clone()
SQLObject_ptr SQLCharExpr::clone()
{
  // return new SQLCharExpr(this->text);
  SQLObject_ptr clone_tmp = SQLCharExpr_ptr(new SQLCharExpr(this->text));
  SQLCharExpr_ptr clone_res = std::dynamic_pointer_cast<SQLCharExpr>(clone_tmp);

  return clone_res;
}